package com.atguigu.mvc.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class Operation09Handler {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private ServletContext servletContext;

    @RequestMapping("/attr/request/model")
    public String attrRequestModel(

            // 声明 Model 类型的形参，可以用于存入模型数据
            Model model) {

        // 将数据存入模型，SpringMVC 会替我们把模型中的数据存入请求域
        model.addAttribute("attrReqModelName", "attrReqModelValue");

        logger.debug("model 全类名：" + model.getClass().getName());

        return "target";
    }

    @RequestMapping("/attr/request/model/map")
    public String attrRequestModelMap(

            // 声明 ModelMap 类型的形参，可以用于存入模型数据
            ModelMap modelMap
    ) {

        // 将数据存入模型，SpringMVC 会替我们把模型中的数据存入请求域
        modelMap.addAttribute("attrReqModelMapName", "attrReqModelMapValue");

        logger.debug("modelMap 全类名：" + modelMap.getClass().getName());

        return "target";
    }

    @RequestMapping("/attr/request/map")
    public String attrRequestMap(

            // 声明 Map 类型的形参，可以用于存入模型数据
            Map<String, Object> map
    ) {

        // 将数据存入模型，SpringMVC 会替我们把模型中的数据存入请求域
        map.put("attrRequestMap", "attrRequestValue");

        logger.debug("map 全类名：" + map.getClass().getName());

        return "target";
    }

    @RequestMapping("/attr/request/original")
    public String attrRequestOriginal(HttpServletRequest request) {

        // 我们自己直接存入请求域，SpringMVC 就不需要做什么了
        request.setAttribute("attrRequestOriginalName", "attrRequestOriginalValue");

        return "target";
    }

    @RequestMapping("/attr/request/model/and/view")
    public ModelAndView useModelAndView() {

        // 创建 ModelAndView 对象
        ModelAndView modelAndView = new ModelAndView();

        // 将数据存入模型
        modelAndView.addObject("attrRequestModelAndViewName", "attrRequestModelAndViewValue");

        // 设置视图名称
        modelAndView.setViewName("target");

        // 返回
        return modelAndView;
    }

    @RequestMapping("/attr/session")
    public String attrSession(

            // 获取原生 HttpSession 对象
            HttpSession session
    ) {

        // 将数据存入会话域
        session.setAttribute("attrSessionName", "attrSessionValue");

        return "target";
    }

    @RequestMapping("/attr/application")
    public String attrApp() {

        // 将数据存入应用域
        servletContext.setAttribute("attrAppName", "attrAppValue");

        return "target";
    }

}
